home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
DRAGON.C
< prev
next >
Wrap
Text File
|
2000-03-20
|
6KB
|
258 lines
/*
#include <stdio.h>
#include <iocslib.h>
void key_wait( void );
#define BIT(i) (1<<(i))
*/
/* ドラゴン */
/* 頭は画面上を動き回り、身体は後を付いていく。 */
/* 右上から左上、左下、右上、消える */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define PALET_MAIN 0x0700
#define R 12
static short MoveEnemyDragonHead(ENEMY *);
/*static void TiniEnemyDragonHead(ENEMY *);*/
static short MoveEnemyDragonBody(ENEMY *);
static short pointer=0,flg=0;
static int body_x[256],body_y[256];
static HIT_XY4 hit_p[32]={
- 8,-16, 8,12,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
-12,-10,15, 8,
-12,- 8,15,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,-12, 8,16,
- 8,-12, 8,16,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
- 8,- 8, 8,10,
-15,- 8,12,10,
-15,-10,12, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-10, 8, 8,
- 8,-16, 8,12,
};
static HIT_XY4 hit_s[32];
static HIT_XY4 hit_body_p[]={-10,-10,10,10};
static HIT_XY4 hit_body_s[]={- 8,- 8, 8, 8};
extern HIT_XY4 nohit;
void InitEnemyDragonHeadHit( void )
{
short i;
for(i=0;i<32;i++){
hit_s[i].x1=hit_p[i].x1 ;hit_s[i].y1=hit_p[i].y1 ;
hit_s[i].x2=hit_p[i].x2 ;hit_s[i].y2=hit_p[i].y2 ;
hit_p[i].x1=hit_p[i].x1-PLAYER_HIT_X;hit_p[i].y1=hit_p[i].y1-PLAYER_HIT_Y;
hit_p[i].x2=hit_p[i].x2+PLAYER_HIT_X;hit_p[i].y2=hit_p[i].y2+PLAYER_HIT_Y;
}
}
void InitEnemyDragonBodyHit( void )
{
hit_body_p[0].x1-=PLAYER_HIT_X;hit_body_p[0].y1-=PLAYER_HIT_Y;
hit_body_p[0].x2+=PLAYER_HIT_X;hit_body_p[0].y2+=PLAYER_HIT_Y;
}
void InitEnemyDragonHead(ENEMY *ene)
{
short i;
ene->lx = (255+64) * 65536; /* 右上から出てくるのが前提 */
ene->ly = 64 * 65536;
ene->vx = -2 * 65536;
ene->vy = 0;
ene->hit_p[0] = &hit_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &nohit ;ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit_s[0];ene->hit_s[1]=NULL;
ene->hp = 200;
ene->angle = 160;
ene->pt = obj_dragon + 128 + ((ene->angle) >> 3);
ene->info = PALET_MAIN | PRIORITY_BOSS-1;
ene->flg = flg = 0;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyDragonHead;
/* ene->func_enemy_tini = TiniEnemyDragonHead;*/
MakeEnemy(ENEMY_DRAGON_BODY, ene->lx>>16, ene->ly>>16,ene->arg, ene); /*ene->argの数だけ身体を出す*/
for(i=0;i<256;i++){
body_x[i]=ene->lx;
body_y[i]=ene->ly;
}
/* entry_counter_stop = !0;*/ /* エントリーカウンター停止 */
}
void InitEnemyDragonBody(ENEMY *ene)
{
ene->hit_p[0] = &hit_body_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &nohit ;ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit_body_s[0];ene->hit_s[1]=NULL;
ene->hp = 200;
ene->pt = obj_dragon+162;
ene->info = PALET_MAIN | PRIORITY_BOSS-2;
ene->angle = 160;
ene->flg = (++flg);
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyDragonBody;
/* ene->func_enemy_tini = TiniEnemyDragonBody;*/
ene->arg--;
if( ene->arg )
MakeEnemy(ENEMY_DRAGON_BODY, ene->lx>>16, ene->ly>>16,ene->arg, ene);
if( ene->arg<5 ){
ene->pt++;
if( ene->arg<2 )
ene->pt++;
}
}
/* ドラゴンの頭の動き */
static short MoveEnemyDragonHead( ENEMY *ene )
{
short pt_num;
if( ene->child_death ){
if( !ene->arg )
return (0); /* 消去 */
pointer++;
pointer&=255;
body_x[pointer]=ene->lx;
body_y[pointer]=ene->ly;
return 1;
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx += ene->vx) >> 16;
ene->y = (ene->ly += ene->vy) >> 16;
pointer++;
pointer&=255;
body_x[pointer]=ene->lx;
body_y[pointer]=ene->ly;
switch (ene->state){
case 0: /* 左上隅へ */
if(ene->angle>192+32)
ene->flg=1;
else if(ene->angle<192-32)
ene->flg=0;
if( ene->flg )
ene->angle-=2;
else
ene->angle+=2;
ene->vy=vy_tbl[13][ene->angle];
/* 斜めに折り返す */
if( ENE_X < 64 )
ene->state++;
break;
case 1: /* 反時計周りに回転 */
ene->angle=(ene->angle-2)&255;
ene->vx=vx_tbl[R][ene->angle];
ene->vy=vy_tbl[R][ene->angle];
if( ene->count++ > 144 ){
ene->count=0;
ene->state++;
}
break;
case 2: /* 左下まで移動 */
/* 斜めに折り返す */
if( ENE_Y > 192 ){
ene->state++;
}
break;
case 3: /* 回転 */
ene->angle=(ene->angle-2)&255;
ene->vx=vx_tbl[R][ene->angle];
ene->vy=vy_tbl[R][ene->angle];
if( ene->count++ > 184 ){
ene->count=0;
ene->state++;
}
break;
case 4: /* 右上へ */
/* 斜めに折り返す */
if( ENE_Y < 64 )
ene->state++;
break;
case 5: /*右下へ*/
ene->angle=(ene->angle-2)&255;
ene->vx=vx_tbl[R][ene->angle];
ene->vy=vy_tbl[R][ene->angle];
if( ene->count++ > 220 )
ene->state++;
break;
case 6: /*右下へ*/
if( ene->y > 120+16 ){
ene->child_death=1;
ene->hit_p[0]=NULL;
}
}
ene->pt = obj_dragon + 128 + (pt_num=(ene->angle >> 3));
ene->hit_p[0] = &hit_p[pt_num];
if(ene->damage)ene->damage = 0;
xobj_set_st(ene);
return(1);
}
/* ドラゴンの身体 */
static short MoveEnemyDragonBody( ENEMY *ene )
{
if( ene->child_death ){
if( !ene->arg ){
ene->parent->arg=0;
return (0); /* 消去 */
}
return(1);
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx=body_x[pointer-ene->parent->flg*8 & 255]) >> 16;
ene->y = (ene->ly=body_y[pointer-ene->parent->flg*8 & 255]) >> 16;
xobj_set_st(ene);
if( ene->parent->child_death && ene->y > 120+16 ){
ene->child_death = 1;
ene->hit_p[0]=NULL;
}
return 1;
}
/*
static void TiniEnemyDragonHead(ENEMY * p)
{
}
*/